/**
 *这段代码定义了一个异步函数 stringToRegisters，
 *其目的是将字符串转换为一系列 16 位（2 字节）的大端序整数数组（unsigned 16-bit BE integers），
 *通常用于需要按寄存器格式传输或存储字符串的场景，例如 Modbus 协议中的字符串写入。
 * @param {*} str
 * @returns
 */
async function stringToRegisters(str) {
  // 根据字符串长度计算所需的 Buffer 长度
  const bufferLength = Math.ceil(str.length / 2) * 2;
  const buffer = Buffer.alloc(bufferLength);
  // 填充buffer
  for (let i = 0; i < str.length; i++) {
    const charCode = str.charCodeAt(i);
    const offset = i;

    // 检查偏移量是否在有效范围内
    if (offset < buffer.length) {
      buffer.writeUInt8(charCode, offset);
    } else {
      console.error("偏移量超出 Buffer 有效范围");
      break;
    }
  }
  // 读取为寄存器数组
  //使用 readUInt16BE 以大端方式读取每两个字节为一个 16 位整数。 • 推入数组返回给调用者。
  const registers = [];
  for (let i = 0; i < buffer.length; i += 2) {
    const registerValue = buffer.readUInt16BE(i);
    registers.push(registerValue);
  }

  return registers;
}

module.exports = {
  stringToRegisters,
};
